package org.summerframework.component.security.security.service;

import org.summerframework.component.security.core.role.AuthenticationService;
import org.summerframework.component.security.core.role.RoleService;
import org.summerframework.component.security.events.AbstractChangeEvent;
import org.summerframework.component.security.permissions.service.dto.UserPermissionsRoleRelDTO;
import org.springframework.context.ApplicationListener;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author 石超
 * @version v1.0.0
 */
public interface DefaultRoleService extends RoleService, AuthenticationService, ApplicationListener<AbstractChangeEvent> {
    ThreadLocal<Boolean> THREAD_LOCAL = ThreadLocal.withInitial(() -> true);
    /**
     * 角色
     */
    String ROLE_KEY = "USER_ROLE_KEY";

    /**
     * 权限
     */
    String PERMISSIONS_KEY = "USER_PERMISSIONS_KEY";

    /**
     * 权限字符串列表
     */
    String PERMISSIONS_LIST_KEY = "USER_PERMISSIONS_LIST_KEY";

    /**
     * 组织机构
     */
    String PERMISSIONS_ORGAN_KEY = "USER_PERMISSIONS_ORGAN_KEY";

    /**
     * 按钮
     */
    String MENU_KEY = "USER_MENU_KEY";

    String ROLE_SAVE_KEY = "session:role:";

    /**
     * 获取所有缓存信息
     *
     * @param userId 用户id
     * @return 缓存信息 key上上面常量
     */
    Map<String, List> get(String userId);

    /**
     * 是否缓存role信息
     *
     * @param userId 用户id
     * @return 是否缓存
     */
    Boolean hasKey(String userId);

    /**
     * 根据key获取
     *
     * @param userId 用户id
     * @param key    key上上面常量
     * @param <T>    泛型
     * @return 对应的值
     */
    <T> List<T> get(String userId, String key);

    void remove(String userId);

    /**
     * 获取菜单
     *
     * @param userId 用户id
     * @return 菜单类别
     */
    List<UserPermissionsRoleRelDTO> getMenu(Long userId);

    /**
     * 获取菜单
     *
     * @param userId 用户id
     * @return 菜单类别
     */
    List<UserPermissionsRoleRelDTO> getMenu(Long userId, Long parentId);

    List<UserPermissionsRoleRelDTO> getTop(Long userId);

    List<UserPermissionsRoleRelDTO> getIndex(Long userId);


    /**
     * 是否是ADMIN
     *
     * @param userId 用户id
     * @return 是否是ADMIN
     */
    Boolean isAdmin(String userId);

    /**
     * 是否是ADMIN
     *
     * @param userId 用户id
     * @return 是否是ADMIN
     */
    Boolean isRole(String userId, String code);

    void parse(String userId);

    /**
     * 是否有该权限
     *
     * @param userId          用户id
     * @param permissionsCode 权限code
     * @return 是否拥有
     */
    Boolean isPermissions(String userId, String permissionsCode);

    Set<String> keys();

    void clean();
}
